/**
 *
 * Phantom OS
 *
 * Copyright (C) 2005-2010 Dmitry Zavalishin, dz@dz.ru
 *
 * Generic 'clone SVGA registers' video card driver.
 *
 *
**/

#ifdef ARCH_ia32

#define DEBUG_MSG_PREFIX "video-clone"
#include <debug_ext.h>
#define debug_level_flow 0
#define debug_level_error 10
#define debug_level_info 0


#include <hal.h>
#include <kernel/vm.h>
#include <kernel/page.h>
#include <kernel/driver.h>

#include <ia32/phantom_pmap.h>
#include <kernel/bus/pci.h>
#include <ia32/pio.h>

#include <phantom_libc.h>

//#include <video.h>
#include <video/screen.h>
#include <video/internal.h>

typedef struct video_clone_regs
{
    unsigned char CRTC[256];
    unsigned char ATTR[256];
    unsigned char SEQR[256];
    unsigned char GRAC[256];
    unsigned char DACW[256];
    unsigned char GF2D[256];

    unsigned char MSR;
    unsigned char FCR;

} vclone_regs_t;


vclone_regs_t svga_vmware =
{
    .CRTC = { 0x5f, 0x7f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x5d, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x3, 0x20, 0x9c, 0x0, 0xff, 0x80, 0x5f, 0x96, 0xb9, 0xa3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, // CRTC
    .ATTR = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x39, 0xa, 0x3b, 0xc, 0x3d, 0xe, 0x3f, 0x10, 0x0, 0x12, 0x8, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x4, 0x24, 0x6, 0x26, 0x8, 0x28, 0xa, 0x2a, 0xc, 0x2c, 0xe, 0x2e, 0x10, 0x30, 0x12, 0x32, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x2, 0x24, 0x4, 0x26, 0x6, 0x28, 0x8, 0x2a, 0xa, 0x2c, 0xc, 0x2e, 0xe, 0x30, 0x10, 0x32, 0x52, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x4, 0x24, 0x6, 0x26, 0x8, 0x28, 0xa, 0x2a, 0xc, 0x2c, 0xe, 0x2e, 0x10, 0x30, 0x52, 0x72, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x2, 0x24, 0x4, 0x26, 0x6, 0x28, 0x8, 0x2a, 0xa, 0x2c, 0xc, 0x2e, 0xe, 0x30, 0x10, 0x72, 0x92, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x4, 0x24, 0x6, 0x26, 0x8, 0x28, 0xa, 0x2a, 0xc, 0x2c, 0xe, 0x2e, 0x10, 0x30, 0x92, 0xb2, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x2, 0x24, 0x4, 0x26, 0x6, 0x28, 0x8, 0x2a, 0xa, 0x2c, 0xc, 0x2e, 0xe, 0x30, 0x10, 0xb2, 0xd2, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x4, 0x24, 0x6, 0x26, 0x8, 0x28, 0xa, 0x2a, 0xc, 0x2c, 0xe, 0x2e, 0x10, 0x30, 0xd2, 0xf2, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, // ATTR
    .SEQR = { 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0x0, 0xa, 0x0, 0x0, 0x0, }, // SEQR
    .GRAC = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x5, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, // GRAC
    .MSR =  0x67, // MSR
    .FCR =  0x0, // FCR
    .DACW = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }, // DACW
    .GF2D = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }, // GF2D

};

static void sregs( int regbase, unsigned char *regs )
{
    int port = 0;
    for(port = 0; port < 256; port++)
    {
        outb( regbase, port );
        outb( regbase+1, regs[port] );
    }
}


static void load_svga_regs(vclone_regs_t *regs)
{
    sregs( 0x03D4, regs->CRTC );
    sregs( 0x03C0, regs->ATTR );
    sregs( 0x03C4, regs->SEQR );
    sregs( 0x03CE, regs->GRAC );
    sregs( 0x03C8, regs->DACW );
    sregs( 0x03D6, regs->GF2D );

    outb( 0x03C2, regs->MSR );
    outb( 0x03DA, regs->FCR );
}

void load_saved_regs()
{
    load_svga_regs( &svga_vmware );
}



static int gen_clone_video_probe();
static int gen_clone_video_start();
static int gen_clone_video_stop();

//static int gen_clone_init();



struct drv_video_screen_t        video_driver_gen_clone =
{
    "GenericClone",
    // size
    1024, 768, 24,
    // mouse x y flags
    0, 0, 0,

    // screen
screen:			0,

probe: 			gen_clone_video_probe,
start: 			gen_clone_video_start,
stop:   		gen_clone_video_stop,

#if 0
update: 		vid_null,
bitblt: 		drv_video_bitblt_rev,
winblt:			drv_video_win_winblt_rev,
readblt: 		drv_video_readblt_rev,
bitblt_part:            drv_video_bitblt_part_rev,

mouse:    		vid_null,

redraw_mouse_cursor: 	drv_video_draw_mouse_deflt,
set_mouse_cursor: 	drv_video_set_mouse_cursor_deflt,
mouse_disable:          drv_video_mouse_off_deflt,
mouse_enable:          	drv_video_mouse_on_deflt,
#endif

};


typedef struct {
    int         dummy;
} gen_clone;

static phantom_device_t * dev;
//static gen_clone * vcard = NULL;

static int n_pages = 1024;


static int seq_number = 0;
phantom_device_t * driver_video_gen_clone_pci_probe( pci_cfg_t *pci, int stage )
{
    (void) stage;
#if 1
    (void) pci;
    return 0; // off
#else
    if( seq_number )
    {
        SHOW_ERROR0( 0, "Just one");
        return 0;
    }

    SHOW_FLOW( 1, "probe vid %x dev %x", pci->vendor_id, pci->device_id );

    vcard = calloc(1, sizeof(gen_clone));
    dev = malloc(sizeof(phantom_device_t));
    if( (vcard == 0) || (dev == 0) )
    {
        SHOW_ERROR0( 0, "out of mem");
        return 0;
    }

    dev->irq = pci->interrupt;
    dev->iomem = 0;

    int i;
    for (i = 0; i < 6; i++)
    {
        if (pci->base[i] > 0xffff)
        {
            if( dev->iomem == 0 )
            {
                dev->iomem = pci->base[i] & ~0xF; // Clear lower bits - TODO move to some common driver startup code
                dev->iomemsize = pci->size[i];
                n_pages = dev->iomemsize/PAGE_SIZE; // FIXME partial page
                SHOW_INFO( 0,  "base 0x%lx, size 0x%lx", dev->iomem, dev->iomemsize );
            }
            else
                SHOW_ERROR( 0,  "unused base 0x%lx, size 0x%lx", pci->base[i], pci->size[i] );
        }
        else if( pci->base[i] > 0)
        {
            dev->iobase = pci->base[i];
            SHOW_INFO( 0,  "io_port 0x%x", dev->iobase );
        }
    }

    if(dev->iomem == 0 )
    {
        SHOW_ERROR0( 0, "no mem defined");
        goto free;
    }

    SHOW_FLOW0( 1, "init");
    if (gen_clone_init() < 0)
    {
        SHOW_ERROR0( 0, "init failed");
        goto free;
    }


    dev->name = "gen_clone";
    dev->seq_number = seq_number++;
    dev->drv_private = vcard;


    SHOW_INFO0( 1, "inited");
    return dev;

free:
    free(vcard);
    free(dev);
    return 0;
#endif
}


/*
static int gen_clone_init()
{
    return 0;
}
*/



static int gen_clone_video_probe()
{
    if(!seq_number)
        return VIDEO_PROBE_FAIL;

    if( hal_alloc_vaddress((void **)&video_driver_gen_clone.screen, n_pages) )
        panic("Can't alloc vaddress for %d videmem pages", n_pages);

    SHOW_FLOW( 7, "vmem va 0x%X", video_driver_gen_clone.screen);


    //printf("Intel board 0x%x found\n", id);
    return VIDEO_PROBE_SUCCESS;
}






static void gen_clone_map_video(int on_off)
{
    assert( video_driver_gen_clone.screen != 0 );

    SHOW_FLOW( 7, "map vmem va 0x%X pa 0x%x", video_driver_gen_clone.screen, dev->iomem );

    hal_pages_control_etc(
                          dev->iomem,
                          video_driver_gen_clone.screen,
                          n_pages, on_off ? page_map : page_unmap, page_rw,
                          INTEL_PTE_WTHRU|INTEL_PTE_NCACHE );
}

static int gen_clone_video_start()
{
    gen_clone_map_video( 1 );
    load_saved_regs();
    return 0;
}

static int gen_clone_video_stop()
{
    gen_clone_map_video(0);
    video_drv_basic_vga_set_text_mode();
    return 0;
}




#endif // ARCH_ia32






























